package com.ux.validators
{
	
	/**
	 * DateValidator, 단순 유효성검사와 기간검사만 제공<br>
	 * @author lth
	 * 
	 */	
	public class DateValidator extends ValidatorDebug
	{
		
		
		private static var errorMsg_Type0:String = "\nDateValidator\n유효성 검사를 시작할 값을 넣어주세요.";
		private static var errorMsg_Type1:String = "\nDateValidator\n유효한 날짜가 아닙니다.";
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		//public static const
		
		
		
		
		
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		//constructor
		public function DateValidator()
		{
		}
		
		
		
		
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		//public static function
		
		/**
		 * currentDate를 기준으로 validDate가 가용범위에 존재하는지 체크 
		 * isPrev가 true이면 checkPrevDay()호출
		 * isPrev가 false이면checkNextDay()호출
		 * @param currentDate
		 * @param validDate
		 * @param isPrev
		 * @return 
		 * 
		 */		
		public static function checkRange( currentDate:Date, validDate:Date, isPrev:Boolean=true ): Boolean
		{
			
			return ( isPrev ) ? checkPrevDay( currentDate, validDate ) : checkNextDay( currentDate, validDate );
			
		}
		
		/**
		 * 디버그모드 설저 
		 * @param value
		 * 
		 */		
		public static function set debugMode( value:String ): void
		{
			isDebug = value;
		}
		
		
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		//private static function
		
		/**
		 * 날짜로 사용할 수 있는 형태인지 체크, Date, String, Number에 대해서 유효성을 검사 
		 * @param value
		 * @return 
		 * 
		 */		
		public static function validate( value:* ): Boolean
		{
			var validTypeList:Array = [ Date, String, Number ];
			if( value is Date || value is String || value is Number ) return true;
			return false;
		}
		
		private static var millisecondsPerDay:int = 1000 * 60 * 60 * 24;
		
		
		//validDate가 currentDate보다 이전날짜인지...
		private static function checkPrevDay( currentDate:Date, validDate:Date ): Boolean
		{
			if( int( currentDate.time/millisecondsPerDay ) < int( validDate.time/millisecondsPerDay ) ) {
				return true;
			}
			
			return false;
		}
		
		
		//validDate가 currentDate보다 이후날짜인지...
		private static function checkNextDay( currentDate:Date, validDate:Date ): Boolean
		{
			if( int( currentDate.time/millisecondsPerDay ) > int( validDate.time/millisecondsPerDay ) ) {
				return true;
			}
			
			return false;
		}
		
		
		
		/**
		 * 윤년 여부를 체크하여 윤년이면 true를, 아니면 false를 리턴한다.
		 */		
		public static function isLeapYear( value:String ) : Boolean
		{
			var year:Number = Number( value );
			if( year < 100 ) {
	        	year = year + 1900;
	  		}
	  		
	        if ( ( year % 4 == 0 ) && ( year % 100 != 0 ) || ( year % 400 == 0 ) ) {
				return true;
	        }
	        else {
				return false;
	        }
		}
		
		
	}
}